package br.com.rotary.manager;

import br.com.rotary.enums.Relatorio;
import br.com.rotary.enums.TipoConvidado;
import br.com.rotary.enums.TipoParticipante;
import br.com.rotary.modelo.Clube;
import br.com.rotary.modelo.Estado;
import br.com.rotary.modelo.FichaInscricao;
import br.com.rotary.servico.ClubeServico;
import br.com.rotary.servico.EstadoServico;
import br.com.rotary.servico.FichaInscricaoServico;
import br.com.rotary.servico.PessoaServico;
import br.com.rotary.servico.RelatorioServico;
import br.com.rotary.vo.RelatorioFinanceiroVO;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerRelatorio {

    @EJB
    RelatorioServico relatorioServico;
    @EJB
    EstadoServico estadoServico;
    @EJB
    FichaInscricaoServico fichaServico;
    @EJB
    PessoaServico pessoaServico;
    @EJB
    ClubeServico clubeServico;
    private List<Estado> estados;
    private List<Clube> clubes;
    private List<Clube> clubesMaisInscritos;
    private Double maiorQuantidade;
    private Long quantidadeRotarianos;
    private Long quantidadeConvidados;
    private List<RelatorioFinanceiroVO> relatorioFinanceiro;
    private BigDecimal total;
    private List<Map<String, String>> quantidadeGeralParticipantes;

    @PostConstruct
    public void init() {
        this.estados = estadoServico.pesquisarTodos();
        this.clubes = fichaServico.pesquisarClubesCadastrados();
        this.clubesMaisInscritos = new ArrayList<Clube>();
        this.maiorQuantidade = 0.0;
        this.relatorioFinanceiro = new ArrayList<RelatorioFinanceiroVO>();

        maiorQuantidadePorClube();
        relatorioFinanceiro();
    }

    private void geral() {
        this.quantidadeRotarianos = relatorioServico.quantidadeGeral(true);
        this.quantidadeConvidados = relatorioServico.quantidadeGeral(false);

        Map<String, String> item = new HashMap<String, String>();

        this.quantidadeGeralParticipantes = new ArrayList<Map<String, String>>();

        item.put("texto", "Todos");
        item.put("valor", pessoaServico.pesquisarTodos().size() + "");

        this.quantidadeGeralParticipantes.add(item);

        item = new HashMap<String, String>();

        item.put("texto", "Apenas Rotarianos");
        item.put("valor", this.quantidadeRotarianos.toString());

        this.quantidadeGeralParticipantes.add(item);

    }

    public Long quantidadeEstado(Estado estado) {
        return pessoaServico.quantidadeEstado(estado, null);
    }

    public Long quantidadeEstadoRotariano(Estado estado) {
        return pessoaServico.quantidadeEstado(estado, TipoParticipante.ROTARIANO);
    }

    public Long quantidadeEstadoConvidado(Estado estado) {
        return pessoaServico.quantidadeEstado(estado, TipoParticipante.CONVIDADDO);
    }

    public Long quantidadeClube(Clube clube) {
        return relatorioServico.quantidadeClube(clube, null);
    }

    private void maiorQuantidadePorClube() {

        Long quantidadeClube;
        Integer quantidadeTotalClube;
        Double percentual;

        for (Clube c : fichaServico.pesquisarClubesCadastrados()) {

            quantidadeClube = quantidadeClube(c);
            quantidadeTotalClube = c.getQuantidade();

            percentual = (100 * quantidadeClube) / quantidadeTotalClube.doubleValue();

            if (percentual > this.maiorQuantidade) {
                this.clubesMaisInscritos.clear();
                this.clubesMaisInscritos.add(c);
                this.maiorQuantidade = percentual;
            }

            if (percentual == this.maiorQuantidade && !this.clubesMaisInscritos.contains(c)) {
                this.clubesMaisInscritos.add(c);
                this.maiorQuantidade = percentual;
            }
        }
    }

    private void relatorioFinanceiro() {
        geral();

        this.relatorioFinanceiro.add(new RelatorioFinanceiroVO(TipoParticipante.ROTARIANO.getNome(), this.quantidadeRotarianos, this.quantidadeRotarianos * 150, 150L));
        this.relatorioFinanceiro.add(new RelatorioFinanceiroVO(TipoParticipante.CONVIDADDO.getNome(), this.quantidadeConvidados, this.quantidadeConvidados * 100, 100L));

        this.total = new BigDecimal((this.quantidadeRotarianos * 150) + (this.quantidadeConvidados * 100));
    }

    public void imprimirRelacaoClube(Integer clubeMaisIncritos) {

        List<Map<String, String>> relatorio = new ArrayList<Map<String, String>>();
        Map<String, String> item;
        Long participantes;

        HashMap parametros = new HashMap();

        if (clubeMaisIncritos == 0) {

            for (Clube clube : this.clubesMaisInscritos) {

                item = new HashMap<String, String>();

                participantes = quantidadeClube(clube);

                item.put("clube", clube.getNome() + " - " + clube.getEstado().getSigla());
                item.put("participantes", participantes.toString());
                item.put("socios", clube.getQuantidade().toString());
                item.put("total", ((100 * participantes.doubleValue()) / clube.getQuantidade()) + "");

                relatorio.add(item);
            }

            parametros.put("TITULO", "CLUBES COM MAIS INSCRITOS");
        } else if (clubeMaisIncritos == 1) {
        } else if (clubeMaisIncritos == 2) {
            for (Clube clube : this.clubes) {

                item = new HashMap<String, String>();

                participantes = quantidadeClube(clube);

//                (100*managerRelatorio.quantidadeClube(item)/item.quantidade)*10

                item.put("clube", clube.getNome() + " - " + clube.getEstado().getSigla());
                item.put("participantes", participantes.toString());
                item.put("socios", clube.getQuantidade().toString());
                item.put("total", ((100 * participantes.doubleValue()) / clube.getQuantidade()) + "");

                relatorio.add(item);
            }

            parametros.put("TITULO", "QUANTIDADE DE PARTICIPANTES POR CLUBES");
        }

        RelatorioServico.genReport(parametros, relatorio, Relatorio.CLUBE);
    }

    public void imprimirRelatorioDetalhado() {
        HashMap parametros = new HashMap();
        List<Map<String, String>> relatorio = new ArrayList<Map<String, String>>();
        Map<String, String> item;
        Integer quantidade;

        for (TipoParticipante tipo : TipoParticipante.values()) {

            quantidade = fichaServico.quantidadeDeInscritosParticipante(tipo);

            if (quantidade > 0) {

                item = new HashMap<String, String>();

                item.put("nome", tipo.getNome());
                item.put("quantidade", fichaServico.quantidadeDeInscritosParticipante(tipo).toString());

                relatorio.add(item);
            }
        }

        for (TipoConvidado tipo : TipoConvidado.values()) {

            quantidade = fichaServico.quantidadeDeInscritosConvidados(tipo);

            if (quantidade > 0) {

                item = new HashMap<String, String>();

                item.put("nome", tipo.getNome());
                item.put("quantidade", fichaServico.quantidadeDeInscritosConvidados(tipo).toString());

                relatorio.add(item);
            }
        }

        List<FichaInscricao> fichas = fichaServico.fichas();

        RelatorioServico.genReport(parametros, relatorio, Relatorio.DETALHADO);
    }

    public List<Estado> getEstados() {
        return estados;
    }

    public void setEstados(List<Estado> estados) {
        this.estados = estados;
    }

    public List<Clube> getClubes() {
        return clubes;
    }

    public void setClubes(List<Clube> clubes) {
        this.clubes = clubes;
    }

    public List<Clube> getClubesMaisInscritos() {
        return clubesMaisInscritos;
    }

    public void setClubesMaisInscritos(List<Clube> clubesMaisInscritos) {
        this.clubesMaisInscritos = clubesMaisInscritos;
    }

    public Double getMaiorQuantidade() {
        return maiorQuantidade;
    }

    public void setMaiorQuantidade(Double maiorQuantidade) {
        this.maiorQuantidade = maiorQuantidade;
    }

    public Long getQuantidadeRotarianos() {
        return quantidadeRotarianos;
    }

    public void setQuantidadeRotarianos(Long quantidadeRotarianos) {
        this.quantidadeRotarianos = quantidadeRotarianos;
    }

    public Long getQuantidadeConvidados() {
        return quantidadeConvidados;
    }

    public void setQuantidadeConvidados(Long quantidadeConvidados) {
        this.quantidadeConvidados = quantidadeConvidados;
    }

    public List<RelatorioFinanceiroVO> getRelatorioFinanceiro() {
        return relatorioFinanceiro;
    }

    public void setRelatorioFinanceiro(List<RelatorioFinanceiroVO> relatorioFinanceiro) {
        this.relatorioFinanceiro = relatorioFinanceiro;
    }

    public BigDecimal getTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }

    public List<Map<String, String>> getQuantidadeGeralParticipantes() {
        return quantidadeGeralParticipantes;
    }

    public void setQuantidadeGeralParticipantes(List<Map<String, String>> quantidadeGeralParticipantes) {
        this.quantidadeGeralParticipantes = quantidadeGeralParticipantes;
    }

    public List<Map<String, String>> clubesMaisInscritosRotariano() {

        List<Map<String, String>> results = new ArrayList<Map<String, String>>();
        Map<String, String> result;
        Clube clube;
        Long quantidadeClube;
        Integer quantidadeTotalClube;
        Double percentual;

        for (Object[] o : fichaServico.clubeMaisInscritosRotarianos()) {
            result = new HashMap<String, String>();

            if (clubeServico.autocomplete(o[0].toString()) != null && !clubeServico.autocomplete(o[0].toString()).isEmpty()) {
                clube = clubeServico.autocomplete(o[0].toString()).get(0);

                quantidadeClube = quantidadeClube(clube);
                quantidadeTotalClube = clube.getQuantidade();

                percentual = (100 * quantidadeClube) / quantidadeTotalClube.doubleValue();
                String valor = percentual.toString();

                if (valor.length() > 6) {
                    valor = valor.substring(0, 6);
                }

                result.put("clube", o[0].toString() + " - ".concat(o[1].toString()));
                result.put("quantidade", valor);

                results.add(result);
            }
        }

        return results;
    }

    public List<Map<String, String>> clubesMaisInscritosCaravana() {

        List<Map<String, String>> results = new ArrayList<Map<String, String>>();
        Map<String, String> result;

        for (Object[] o : fichaServico.clubeMaisInscritosCaravana()) {
            result = new HashMap<String, String>();

            result.put("clube", o[0].toString() + " - ".concat(o[1].toString()));
            result.put("quantidade", o[2].toString());

            results.add(result);
        }

        return results;
    }
}
